"use strict"

var os = require("os")
var gulp = require("gulp")
var gutil = require("gulp-util")
var sass = require("gulp-ruby-sass")
// var jshint = require('gulp-jshint')
var uglify = require("gulp-uglifyjs")
var rename = require("gulp-rename")
var concat = require("gulp-concat")
var notify = require("gulp-notify")
var header = require("gulp-header")
var minifycss = require("gulp-minify-css")
// var jsdoc        = require("gulp-jsdoc");
// var jsdoc2md     = require("gulp-jsdoc-to-markdown");
var pkg = require("./package.json")
var dateFormat = require("dateformatter").format
var replace = require("gulp-replace")

pkg.name = "Editor.md"
pkg.today = dateFormat

var headerComment = ["/*",
  " * <%= pkg.name %>",
  " *",
  " * @file        <%= fileName(file) %> ",
  " * @version     v<%= pkg.version %> ",
  " * @description <%= pkg.description %>",
  " * @license     MIT License",
  " * @author      <%= pkg.author %>",
  " * {@link       <%= pkg.homepage %>}",
  " * @updateTime  <%= pkg.today('Y-m-d') %>",
  " */",
  "\r\n"].join("\r\n")

var headerMiniComment = "/*! <%= pkg.name %> v<%= pkg.version %> | <%= fileName(file) %> | <%= pkg.description %> | MIT License | By: <%= pkg.author %> | <%= pkg.homepage %> | <%=pkg.today('Y-m-d') %> */\r\n"

var scssTask = function (fileName, path) {
  path = path || "scss/"

  var distPath = "css"

  return sass(path + fileName + ".scss", { style: "expanded", sourcemap: false, noCache: true })
    .pipe(gulp.dest(distPath))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace("\\", "")
      }}))
    .pipe(gulp.dest(distPath))
    .pipe(rename({ suffix: ".min" }))
    .pipe(gulp.dest(distPath))
    .pipe(minifycss())
    .pipe(gulp.dest(distPath))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace("\\", "")
      }}))
    .pipe(gulp.dest(distPath))
    .pipe(notify({ message: fileName + ".scss task completed!" }))
}

gulp.task("scss", function () {
  return scssTask("editormd")
})

gulp.task("scss2", function () {
  return scssTask("editormd.preview")
})

gulp.task("scss3", function () {
  return scssTask("editormd.logo")
})

gulp.task("js", function () {
  return gulp.src("./src/editormd.js")
    // .pipe(jshint('./.jshintrc'))
    // .pipe(jshint.reporter('default'))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace(/[\\\/]?/, "")
      }}))
    .pipe(gulp.dest("./"))
    .pipe(rename({ suffix: ".min" }))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
    .pipe(gulp.dest("./"))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + ((os.platform() === "win32") ? "\\" : "/"))
        return name[1].replace(/[\\\/]?/, "")
      }}))
    .pipe(gulp.dest("./"))
    .pipe(notify({ message: "editormd.js task complete" }))
})

gulp.task("amd", function () {
  var replaceText1 = [
    "var cmModePath  = \"codemirror/mode/\";",
    "            var cmAddonPath = \"codemirror/addon/\";",
    "",
    "            var codeMirrorModules = [",
    "                \"jquery\", \"marked\", \"prettify\",",
    "                \"katex\", \"raphael\", \"underscore\", \"flowchart\",  \"jqueryflowchart\",  \"sequenceDiagram\",",
    "",
    "                \"codemirror/lib/codemirror\",",
    "                cmModePath + \"css/css\",",
    "                cmModePath + \"sass/sass\",",
    "                cmModePath + \"shell/shell\",",
    "                cmModePath + \"sql/sql\",",
    "                cmModePath + \"clike/clike\",",
    "                cmModePath + \"php/php\",",
    "                cmModePath + \"xml/xml\",",
    "                cmModePath + \"markdown/markdown\",",
    "                cmModePath + \"javascript/javascript\",",
    "                cmModePath + \"htmlmixed/htmlmixed\",",
    "                cmModePath + \"gfm/gfm\",",
    "                cmModePath + \"http/http\",",
    "                cmModePath + \"go/go\",",
    "                cmModePath + \"dart/dart\",",
    "                cmModePath + \"coffeescript/coffeescript\",",
    "                cmModePath + \"nginx/nginx\",",
    "                cmModePath + \"python/python\",",
    "                cmModePath + \"perl/perl\",",
    "                cmModePath + \"lua/lua\",",
    "                cmModePath + \"r/r\", ",
    "                cmModePath + \"ruby/ruby\", ",
    "                cmModePath + \"rst/rst\",",
    "                cmModePath + \"smartymixed/smartymixed\",",
    "                cmModePath + \"vb/vb\",",
    "                cmModePath + \"vbscript/vbscript\",",
    "                cmModePath + \"velocity/velocity\",",
    "                cmModePath + \"xquery/xquery\",",
    "                cmModePath + \"yaml/yaml\",",
    "                cmModePath + \"erlang/erlang\",",
    "                cmModePath + \"jade/jade\",",
    "",
    "                cmAddonPath + \"edit/trailingspace\", ",
    "                cmAddonPath + \"dialog/dialog\", ",
    "                cmAddonPath + \"search/searchcursor\", ",
    "                cmAddonPath + \"search/search\", ",
    "                cmAddonPath + \"scroll/annotatescrollbar\", ",
    "                cmAddonPath + \"search/matchesonscrollbar\", ",
    "                cmAddonPath + \"display/placeholder\", ",
    "                cmAddonPath + \"edit/closetag\", ",
    "                cmAddonPath + \"fold/foldcode\",",
    "                cmAddonPath + \"fold/foldgutter\",",
    "                cmAddonPath + \"fold/indent-fold\",",
    "                cmAddonPath + \"fold/brace-fold\",",
    "                cmAddonPath + \"fold/xml-fold\", ",
    "                cmAddonPath + \"fold/markdown-fold\",",
    "                cmAddonPath + \"fold/comment-fold\", ",
    "                cmAddonPath + \"mode/overlay\", ",
    "                cmAddonPath + \"selection/active-line\", ",
    "                cmAddonPath + \"edit/closebrackets\", ",
    "                cmAddonPath + \"display/fullscreen\",",
    "                cmAddonPath + \"search/match-highlighter\"",
    "            ];",
    "",
    "            define(codeMirrorModules, factory);"
  ].join("\r\n")

  var replaceText2 = [
    "if (typeof define == \"function\" && define.amd) {",
    "       $          = arguments[0];",
    "       marked     = arguments[1];",
    "       prettify   = arguments[2];",
    "       katex      = arguments[3];",
    "       Raphael    = arguments[4];",
    "       _          = arguments[5];",
    "       flowchart  = arguments[6];",
    "       CodeMirror = arguments[9];",
    "   }"
  ].join("\r\n")

  gulp.src("src/editormd.js")
    .pipe(rename({ suffix: ".amd" }))
    .pipe(gulp.dest("./"))
    .pipe(header(headerComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base)
        return name[1].replace(/[\\\/]?/, "")
      }}))
    .pipe(gulp.dest("./"))
    .pipe(replace("/* Require.js define replace */", replaceText1))
    .pipe(gulp.dest("./"))
    .pipe(replace("/* Require.js assignment replace */", replaceText2))
    .pipe(gulp.dest("./"))
    .pipe(rename({ suffix: ".min" }))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
    .pipe(gulp.dest("./"))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + ((os.platform() === "win32") ? "\\" : "/"))
        return name[1].replace(/[\\\/]?/, "")
      }}))
    .pipe(gulp.dest("./"))
    .pipe(notify({ message: "amd version task complete"}))
})

var codeMirror = {
  path: {
    src: {
      mode: "lib/codemirror/mode",
      addon: "lib/codemirror/addon"
    },
    dist: "lib/codemirror"
  },
  modes: [
    "css",
    "sass",
    "shell",
    "sql",
    "clike",
    "php",
    "xml",
    "markdown",
    "javascript",
    "htmlmixed",
    "gfm",
    "http",
    "go",
    "dart",
    "coffeescript",
    "nginx",
    "python",
    "perl",
    "lua",
    "r",
    "ruby",
    "rst",
    "smartymixed",
    "vb",
    "vbscript",
    "velocity",
    "xquery",
    "yaml",
    "erlang",
    "jade"
  ],

  addons: [
    "edit/trailingspace",
    "dialog/dialog",
    "search/searchcursor",
    "search/search",
    "scroll/annotatescrollbar",
    "search/matchesonscrollbar",
    "display/placeholder",
    "edit/closetag",
    "fold/foldcode",
    "fold/foldgutter",
    "fold/indent-fold",
    "fold/brace-fold",
    "fold/xml-fold",
    "fold/markdown-fold",
    "fold/comment-fold",
    "mode/overlay",
    "selection/active-line",
    "edit/closebrackets",
    "display/fullscreen",
    "search/match-highlighter"
  ]
}

gulp.task("cm-mode", function () {
  var modes = [
    codeMirror.path.src.mode + "/meta.js"
  ]

  for (var i in codeMirror.modes) {
    var mode = codeMirror.modes[i]
    modes.push(codeMirror.path.src.mode + "/" + mode + "/" + mode + ".js")
  }

  return gulp.src(modes)
    .pipe(concat("modes.min.js"))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + "\\")
        return (name[1] ? name[1] : name[0]).replace(/\\/g, "")
      }}))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(notify({ message: "codemirror-mode task complete!" }))
})

gulp.task("cm-addon", function () {
  var addons = []

  for (var i in codeMirror.addons) {
    var addon = codeMirror.addons[i]
    addons.push(codeMirror.path.src.addon + "/" + addon + ".js")
  }

  return gulp.src(addons)
    .pipe(concat("addons.min.js"))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(header(headerMiniComment, {pkg: pkg,
      fileName: function (file) {
        var name = file.path.split(file.base + "\\")
        return (name[1] ? name[1] : name[0]).replace(/\\/g, "")
      }}))
    .pipe(gulp.dest(codeMirror.path.dist))
    .pipe(notify({ message: "codemirror-addon.js task complete" }))
})
/*
gulp.task("jsdoc", function(){
    return gulp.src(["./src/editormd.js", "README.md"])
               .pipe(jsdoc.parser())
               .pipe(jsdoc.generator("./docs/html"));
});

gulp.task("jsdoc2md", function() {
    return gulp.src("src/js/editormd.js")
            .pipe(jsdoc2md())
            .on("error", function(err){
                gutil.log(gutil.colors.red("jsdoc2md failed"), err.message);
            })
            .pipe(rename(function(path) {
                path.extname = ".md";
            }))
            .pipe(gulp.dest("docs/markdown"));
});
*/
gulp.task("watch", function () {
  gulp.watch("scss/editormd.scss", ["scss"])
  gulp.watch("scss/editormd.preview.scss", ["scss", "scss2"])
  gulp.watch("scss/editormd.logo.scss", ["scss", "scss3"])
  gulp.watch("src/editormd.js", ["js", "amd"])
})

gulp.task("default", function () {
  gulp.run("scss")
  gulp.run("scss2")
  gulp.run("scss3")
  gulp.run("js")
  gulp.run("amd")
  gulp.run("cm-addon")
  gulp.run("cm-mode")
})
